package com.example.democlient.lambda;

import org.junit.jupiter.api.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * 1
 * lambda 表达式的基础语法：java8中引入了一个新的操作符“->” 该操作符称为箭头操作符或lambda操作符
 *   箭头操作符将Lambda表达式分为两部分：
 * 左侧：  Lambda 表达式的参数列表
 * 右侧：  Lambda 表达式中所需执行的功能，即Lambda表达式。
 *
 * 语法格式一：无参数，无返回值：
 *             ()->System.out.println(“Hoello Lambda”);
 * 语法格式二：一个参数，无返回值
 *           (x) -> System.out.println(x)
 * 语法格式三： 若只有一个参数，小括号可以省略不写
 *             x -> System.out.println(x)
 * 语法格式四： 有两个以上的参数，有返回值，并且lambda体中有多条语句
 *              Comparator<Integer> com = (x, y) ->{
 *             System.out.println("函数式接口");
 *             return Integer.compare(x,y);
 *         };
 * 语法格式五： 若Lambda 体中只有一条语句，return 和 大括号都可以省略不写
 *           Comparator<Integer> com = (x, y) ->Integer.compare(x,y);
 *
 * 语法格式六： lambda 表达式的参数列表的数据类型可以省略不写，因为jvm编译器通过上下文
 *             可以推断出数据类型，称之为“类型推断”
 *
 * 总结：左右遇一括号升
 *       左侧推断类型省
 * 2
 * Lambda 表达式需要函数式接口的支持
 * 函数式接口：接口中只有一个抽象方法时，称之为函数式接口
 * 可以用@FunctionalInterface修饰
 *
 */
public class TestLambda2 {

    @Test
    public void test1(){

        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello world");
            }
        };
        r.run();

        System.out.println("------------------");
        Runnable r1 = () -> System.out.println("Lambda");
        r1.run();
    }

    @Test
    public void test2(){

//        Consumer<String> con = (x) -> System.out.println(x);
        Consumer<String> con = x -> System.out.println(x);
        con.accept("你真牛逼");
    }

    @Test
    public void test3(){
        Comparator<Integer> com = (x, y) ->{
            System.out.println("函数式接口");
            return Integer.compare(x,y);
        };
    }

    @Test
    public void test4(){
        Comparator<Integer> com = (x, y) ->Integer.compare(x,y);

    }

    @Test
    public void Test5(){
        Integer operation = operation(100, (x) -> x * x);
        System.out.println(operation);

        System.out.println(operation(200,(y)->y+600));
    }

    public Integer operation(Integer num,MyFun myFun){
        return myFun.getValue(num);
    }



}
